package class2;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;

public class Code01_RandToRand {
    public static void main(String[] args) throws InterruptedException {
        // 随机数
//        double random = Math.random();
//        System.out.println("random = " + random);

//        等概率返回数
//        test01();

        // 数组随机位置
//        test02();
        // 返回概率平方
//        test04();

        int testTimes = 1000000;
//        int count = 0;
//        for (int i = 0; i < testTimes; i++) {
//            if (f2() == 0) {
//                count++;
//            }
//        }
//        System.out.println(count / (double) testTimes);

        int[] counts = new int[8];
        for (int i = 0; i < testTimes; i++) {
            int num = g();
            counts[num]++;
        }
        System.out.println(Arrays.toString(counts));

        int[] counts2 = new int[11];
        for (int i = 0; i < testTimes; i++) {
            counts2[rand10()]++;
        }
        System.out.println(Arrays.toString(counts2));


    }


    // 1~5的随机数
    public static int f1() {
        return (int) (Math.random() * 5) + 1;
    }

    public static int f2() {
        int ans;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    // 得到000 ~ 111 的等概率
    public static int f3() {
        return (f2() << 2) + (f2() << 1) + (f2() << 0);
    }

    public static int f4() {
        int ans;
        do {
            ans = f3();
        } while (ans == 7);
        return ans;
    }

    public static int g() {
        return f4() + 1;
    }

    private static void test04() {
        int testTimes = 1000000;
        int count = 0;
        double x = 0.17;
        for (int i = 0; i < testTimes; i++) {
            if (test03() < x) {
                count++;
            }
        }
        System.out.println(count / (double) testTimes);
        System.out.println(Math.pow(0.17, 2));
    }

    // 返回[0,1)的一个小数
    // 任意的x,x属于[0,1)，[0,x)范围上的数出现概率由原来的x调整成x平方
    public static double test03() {
        return Math.max(Math.random(), Math.random());
    }

    private static void test02() {
        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int i = 0; i < 100; i++) {
            // 等概率返回 -> [0,arr.length) => [0,9]
            int v = (int) (Math.random() * arr.length);
            System.out.println("v = " + v + "\t" + arr[v]);
        }
    }


    private static void test01() {
        int testTimes = 1000000;
        int count = 0;
        for (int i = 0; i < testTimes; i++) {
            if (Math.random() < .3) {
                count++;
            }
        }
        // 等概率数
        System.out.println(count / (double) testTimes);
    }

    public static int rand10() {
        while (true) {
            // 生成 1 到 49 范围的随机数
            int num = (rand7() - 1) * 7 + rand7();
            // 如果 rand49 小于等于 40，则可以用 rand49 % 10 映射到 [1, 10]
            if (num <= 40) {
                // 为了将 num 从 [1, 40] 映射到 [0, 39]。
                // 这样做是为了方便计算余数，并确保它能正确映射到 0 到 9 范围内。
                return (num - 1) % 10 + 1;
            }
        }
    }

    public static int rand7() {
        return (int) (Math.random() * 7) + 1;
    }

}
